package com.gosling.gosling;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.poi.excel.ExcelWriter;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.annotation.Resource;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Test20240618 {

    @Resource(name = "asyncServiceExecutor")
    private ThreadPoolTaskExecutor executor;

    private static final int BATCH_SIZE = 30000;
    public static void main(String[] args) throws Exception {

        LocalDateTime x = DateUtil.parseLocalDateTime("2024-07-15 00:00:00", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(x);
        System.out.println(x.toLocalDate());
//        int compare = LocalDate.now().compareTo(LocalDateTime.parse("2024-07-15 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).toLocalDate());
//        System.out.println(LocalDate.parse("2024-09-09 19:00:00"));
    }

//    private void excelForSub(List<Map<String, Object>> query, ExcelWriter excelWriter, List<String> subTableIdAndNameList, String sql,
//                             SqlAndJarForExcelDto forExcelDto, QueryDetailDto qdDto) {
//        //查询子表表头信息
//        for (String s : subTableIdAndNameList) {
//            String subTableId = s.split("_")[0];
//            SubTableInfoVO vo = combinedViewSubTableService.getSubTableInfo(subTableId);
//            CombinedViewSubTableEntity subTableInfo = vo.getSubTableInfo();
//            //获取子表字段中文名和对应在表中的字段名
//            List<JcoderTableColumnVO> tableColumnVoS = jcoderTableService.getTableColumnVoS(subTableInfo.getTableEnglishName());
//            List<Map<String, Object>> mapList = tableColumnVoS.stream().map(item -> {
//                String k = ObjUtil.isEmpty(item.getComment()) ? item.getField() : item.getComment();
//                String v = item.getField();
//                Map<String, Object> map = new HashMap<>(4);
//                map.put(k, v);
//                return map;
//            }).collect(Collectors.toList());
//            //获取数据
//            List<Map<String, Object>> subtableQuery = new ArrayList<>();
//            //判断是否为jar包获取的数据,jar包导出暂滞空待完善
//            CombinedViewSubTableForJarEntity entity = combinedViewSubTableForJarService.getById(subTableId);
//            if (ObjUtil.isEmpty(entity.getJarId())) {
//                // sql 参数名
//                String[] strings = StrUtil.substringsBetween(vo.getSubTableInfo().getTablePrimordialSql(), "{", "}");
//                if (strings != null &&
//                        // 如果sql参数任一一个在字段参数之内，就用字段参数，并进行循环查询
//                        Arrays.stream(strings).anyMatch(item -> query.get(0).keySet().contains(StrUtil.trim(item)))) {
//                    try {
//                        List<CompletableFuture<Void>> futures = query.stream()
//                                .map(map -> CompletableFuture.runAsync(() -> {
//                                    String sql1 = compositeSql(vo.getSubTableInfo().getTablePrimordialSql(), map);
//                                    if (!org.springframework.util.ObjectUtils.isEmpty(sql1) && !"null".equals(sql1)) {
//                                        List<Map<String, Object>> query1 = jdbcTemplate.queryForList(sql1);
//                                        synchronized (subtableQuery) {
//                                            subtableQuery.addAll(query1);
//                                        }
//                                    }
//                                }, executor))
//                                .collect(Collectors.toList());
//
//                        // 等待所有任务完成
//                        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
//                    } finally {
//                        executor.shutdown();
//                    }
//                } else {
//                    if (forExcelDto.getNotHistory()) {
//                        sql = compositeSql(vo.getSubTableInfo().getTablePrimordialSql(), qdDto.getParams());
//                        subtableQuery.addAll(jdbcTemplate.queryForList(sql));
//                    } else {
//                        subtableQuery.addAll(getMaps(qdDto.getTableEnglishName(), vo, forExcelDto.getOtherParams()));
//                    }
//                }
//                //获取子表的headList
//                List<List<String>> headList = new ArrayList<>();
//                if (ObjUtil.isNotEmpty(subtableQuery)) {
//                    List<String> kList = new ArrayList<>();
//                    subtableQuery.get(0).forEach((k, v) -> {
//                        //包含中文
//                        if (Validator.hasChinese(k)) {
//                            headList.add(Collections.singletonList(k));
//                        }
//                        //表中存在中文注释并使用list记录k值
//                        mapList.forEach(item -> {
//                            for (Map.Entry<String, Object> stringObjectEntry : item.entrySet()) {
//                                if (stringObjectEntry.getValue().equals(k)) {
//                                    headList.add(Collections.singletonList(stringObjectEntry.getKey()));
//                                    kList.add(k);
//                                }
//                            }
//                        });
//                    });
//                    WriteSheet writeSheet = EasyExcel.writerSheet(s.split("_")[1]).head(headList).build();
//
//                    //多线程写excel
//                    try {
//                        int totalData = subtableQuery.size();
//                        int batchCount = (totalData + BATCH_SIZE - 1) / BATCH_SIZE;
//                        List<CompletableFuture<Void>> futures = IntStream.range(0, batchCount)
//                                .mapToObj(i -> CompletableFuture.runAsync(() -> {
//                                    int fromIndex = i * BATCH_SIZE;
//                                    int toIndex = Math.min((i + 1) * BATCH_SIZE, totalData);
//                                    List<Map<String, Object>> batchList = subtableQuery.subList(fromIndex, toIndex);
//
//                                    for (Map<String, Object> row : batchList) {
//                                        List<List<Object>> listData = new ArrayList<>();
//                                        List<Object> data = new ArrayList<>();
//
//                                        // 处理结果集中字段空值
//                                        row.forEach((k, v) -> {
//                                            if (ObjUtil.isEmpty(v)) {
//                                                row.put(k, "-");
//                                            }
//                                        });
//
//                                        int kIndex = 0;
//                                        for (List<String> head : headList) {
//                                            Object obj = row.get(head.get(0));
//                                            if (ObjUtil.isNotEmpty(obj)) {
//                                                data.add(obj);
//                                            } else {
//                                                Object o = row.get(kList.get(kIndex));
//                                                data.add(o);
//                                                kIndex++;
//                                            }
//                                        }
//                                        listData.add(data);
//                                        synchronized (excelWriter) {
//                                            excelWriter.write(listData, writeSheet);
//                                        }
//                                    }
//                                }, executor)).collect(Collectors.toList());
//
//                        // 等待所有任务完成
//                        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
//                    } finally {
//                        executor.shutdown();
//                    }
//
//                } else {
//                    //query为空值通过sql获取表头集合
//                    String between = StrUtil.subBetween(sql, "SELECT", "FROM");
//                    List<String> list = StrUtil.splitTrim(between, ",");
//                    list.forEach(item -> {
//                        if (!item.contains("AS")) {
//                            //遍历获取注释中文名称
//                            for (Map<String, Object> map : mapList) {
//                                for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
//                                    if (item.equals(stringObjectEntry.getValue())) {
//                                        headList.add(Collections.singletonList(stringObjectEntry.getKey()));
//                                    }
//                                }
//                            }
//                        } else {
//                            List<String> as = StrUtil.splitTrim(item, "AS");
//                            String s1 = StrUtil.removeAll(as.get(1), "\"");
//                            headList.add(Collections.singletonList(s1));
//                        }
//                    });
//                    excelWriter.write(null, EasyExcel.writerSheet(s.split("_")[1]).head(headList).build());
//                }
//            } else {
//                WriteSheet build = null;
//                List<List<Object>> listData = new ArrayList<>();
//                for (int i = 0; i < query.size(); i++) {
//                    //获取jar包数据表头
//                    JarHandleDto jarHandleDto = new JarHandleDto();
//                    jarHandleDto.setEntity(entity);
//                    jarHandleDto.setMainTableData(query.get(i));
//                    jarHandleDto.setPageBeanSearch(new PageBeanSearch() {{
//                        setCurrentPage(1);
//                        setPageSize(20);
//                    }});
//                    List<Map<String, Object>> jarTableInfo = combinedViewSubTableForJarService.getJarTableInfo(jarHandleDto);
//                    Object o = jarTableInfo.get(0).get("subTableInfoVO");
//                    SubTableInfoVO subTableInfoVO = BeanUtilExt.copyBeanSuper(o, SubTableInfoVO.class);
//                    List<JcoderTableColumnVO> fieldInfo = subTableInfoVO.getFieldInfo().stream().distinct().collect(Collectors.toList());
//                    List<List<String>> lists = fieldInfo.stream().map(item -> {
//                        String s1 = ObjUtil.isEmpty(item.getComment()) ? item.getField() : item.getComment();
//                        return Collections.singletonList(s1);
//                    }).collect(Collectors.toList());
//                    //无数据写sheet表头
//                    if (i == 0) {
//                        build = EasyExcel.writerSheet(s.split("_")[1]).head(lists).build();
//                    }
//                    //填充数据
//                    JSONObject iPage = (JSONObject)jarTableInfo.get(0).get("iPage");
//                    JSONArray records = (JSONArray)iPage.get("records");
//                    for (Object record : records) {
//                        JSONObject jsonObject = (JSONObject) record;
//                        List<Object> data = new ArrayList<>();
//                        fieldInfo.forEach(item -> {
//                            Object e = jsonObject.get(item.getField());
//                            if(e instanceof Date){
//                                e = DateUtil.format((Date) e, "yyyy-MM-dd HH:mm:ss");
//                            }else if(e instanceof Long){
//                                e = DateUtil.format(new Date((Long) e), "yyyy-MM-dd HH:mm:ss");
//                            }
//                            data.add(e);
//                        });
//                        listData.add(data);
//                    }
//                }
//                excelWriter.write(listData, build);
//
//            }
//        }
//
//    }



    private static void aa() {
        LocalDate parse = LocalDate.parse("2023-09-09", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //通用上层格式：yyyyMMddHHmmss
        System.out.println(LocalDateTime.of(parse, LocalTime.now()).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
    }

    private static void loosadd() {
        String a = "1";
        synchronized (a){
            try {
                System.out.println("a对象被加锁");
                a.wait(5000);
                System.out.println("a对象wait了 5s");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("a对象被释放");
    }

    private static void aaaaadate2() {
        String format = LocalDate.parse("2100-01-01", DateTimeFormatter.ofPattern("yyyy-MM-dd")).format(DateTimeFormatter.ISO_DATE);
        System.out.println(format);
        String parse = DateUtil.parse("20240101", DatePattern.PURE_DATE_FORMATTER).toString(DatePattern.NORM_DATE_FORMAT);
        System.out.println(parse);
    }

    private static void aaaadate() {
        DateTime parse = DateUtil.parse("2024-01-01 00:00:01", DatePattern.NORM_DATETIME_FORMAT);
        System.out.println(parse.toString(DatePattern.NORM_TIME_PATTERN));
    }

    private static void setImg() throws DocumentException, IOException {
        // 背景图片路径
        String imagePath = "path/to/your/image.jpg";
        Document document = new Document(PageSize.A4);
        PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
        // 设置背景图片
        Image image = Image.getInstance(imagePath);
        image.scaleToFit(PageSize.A4.getWidth(), PageSize.A4.getHeight());
        document.add(image);
        document.close();
    }

}
